/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package utils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.Serializable;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author aleX
 */
public class DbManager implements Serializable{    
    // transient == non viene serializzato
    private transient Connection con;
public DbManager(String dburl) throws SQLException {
    try {
        Class.forName("com.mysql.jdbc.Driver", true,
        getClass().getClassLoader());
    } catch(Exception e) {
    throw new RuntimeException(e.toString(), e);
    }
Connection con = DriverManager.getConnection(dburl,"root","root");
this.con = con;
}

    public static void shutdown(){
//        try{
//            DriverManager.getConnection("jdbc:mysql://localhost:3306/mercatodb", "root", "root");
//        }catch(SQLException ex){
//            Logger.getLogger(dbManager.class.getName()).info(ex.getMessage());
//        }
    }
    
    //AUTENTICA UTENTE
    public Utilizzatore authenticate(String username, String password) throws SQLException{
     //Connection con= DriverManager.getConnection("jdbc:mysql://localhost:3306/mercatodb");
     //Connection con = dbManager.getConnection();   
 
        PreparedStatement stm = con.prepareStatement(
        "SELECT id,username,nome,cognome,indirizzo,email,data_registrazione,roles FROM utilizzatore WHERE username = ? AND password = ?");
try {
    stm.setString(1, username);
    stm.setString(2, password);
    ResultSet rs = stm.executeQuery();
        try {
            if (rs.next()) {
             Utilizzatore user = new Utilizzatore();
             user.setId_Utilizzatore(rs.getInt("id"));
             user.setUsername(rs.getString("username"));
             user.setNome(rs.getString("nome"));
             user.setCognome(rs.getString("cognome"));
             user.setIndirizzo(rs.getString("indirizzo"));
             user.setEmail(rs.getString("email"));
             user.setData_registrazione(rs.getDate("data_registrazione"));
             user.setRoles(rs.getString("roles"));
             
             return user;
            } else {
                return null;
            }
        } finally {
            rs.close();
        }
} finally { 
    stm.close();
}}

public Utilizzatore upRegistrazione(String username,String nome,String cognome,String password,String email,Timestamp date,String indirizzo) throws SQLException {
        int id=0;
    Utilizzatore user = new Utilizzatore();

PreparedStatement stm = con.prepareStatement("INSERT INTO utilizzatore(username,nome,cognome,indirizzo,email,data_registrazione,roles,password) VALUES (?,?,?,?,?,?,?,?)");
 try{
    String roles= "utilizzatore";
    stm.setString(1, username);
    stm.setString(2, nome);
    stm.setString(3, cognome);
    stm.setString(4, indirizzo);
    stm.setString(5, email);
    stm.setTimestamp(6, date);
    stm.setString(7, roles);
    stm.setString(8, password);
  
    stm.executeUpdate();

} finally {
stm.close();
}
return user;
}

public int controlloUsername(String username) throws SQLException{
    int count=0;
    PreparedStatement stm=con.prepareStatement("SELECT count(username) FROM utilizzatore WHERE username=?");
    try{
        stm.setString(1, username);
        ResultSet rs= stm.executeQuery();
        try{
            if(rs.next()){
            count=rs.getInt("count(username)");
            
        }} finally {
            rs.close();
        }
} finally { 
    stm.close();}
    return count;
}

public List<Prodotti> newProducts(String nomeprod,String descrizione,String categoria,String username,int quant,Timestamp scadenza,float offerta,float incrMin,float prezSped,String urlimg,Timestamp time) throws SQLException, FileNotFoundException {
        int id=0;
    List<Prodotti> products = new ArrayList<Prodotti>();

    PreparedStatement stm = con.prepareStatement("INSERT INTO prodotti(nome_prodotto,descrizione,categoria,venditore,quantita,scadenza,prezzo_iniziale,incremento_minOfferte,prezzo_spedizione,fotografia,data_immissione) VALUES (?,?,?,?,?,?,?,?,?,?,?)");
 try{
    stm.setString(1,nomeprod);
    stm.setString(2, descrizione);
    stm.setString(3, categoria);
    stm.setString(4, username);
    stm.setInt(5, quant);
    stm.setTimestamp(6, scadenza);
    stm.setFloat(7, offerta);
    stm.setFloat(8, incrMin);
    stm.setFloat(9, prezSped);
   // stm.setBinaryStream(9,new FileInputStream(f),(int)f.length());
    stm.setString(10, urlimg);
    stm.setTimestamp(11, time);  
    stm.executeUpdate();

} finally {
stm.close();
}
return products;
}
public List<Prodotti> SearchCategory(String category) throws SQLException{

    List<Prodotti> prod = new ArrayList<Prodotti>();
List<UltimaOfferta> uloff= new ArrayList<UltimaOfferta>();
System.out.println("ok db"+category);
PreparedStatement stm2=con.prepareStatement("SELECT max(offerta),id_prodotto FROM storico_asta WHERE categoria=? AND risultato IS NULL GROUP BY id_prodotto");
try{
    stm2.setString(1, category);
    ResultSet rs=stm2.executeQuery();
    try{
        System.out.println("ok db2");        
        while(rs.next()){
        UltimaOfferta uof = new UltimaOfferta();
        uof.setIdProdotto(rs.getInt("id_prodotto"));
        uof.setUltimaOfferta(rs.getFloat("max(offerta)"));
        uloff.add(uof);
        System.out.println("ok db3");
          }}finally{
        rs.close();}
} finally {
stm2.close();
}


PreparedStatement stm3=con.prepareStatement("UPDATE prodotti SET ultima_offerta= ? WHERE n_lotto= ? ");
       try{
           for (int i=0; i<uloff.size();i++){
           
           System.out.println("ok db4");
           stm3.setFloat(1, uloff.get(i).getUltima_offerta());
           stm3.setInt(2, uloff.get(i).getIdProdotto());
           System.out.println("ok db45"+uloff.get(i).getUltima_offerta());
           
           
           stm3.executeUpdate();}
       }finally{
           stm3.close();
       } 
  
System.out.println("ok db6");
PreparedStatement stm = con.prepareStatement("SELECT n_lotto,nome_prodotto,quantita,descrizione,categoria,venditore,prezzo_iniziale,incremento_minOfferte,fotografia,prezzo_spedizione,scadenza,data_immissione,ultima_offerta FROM prodotti WHERE categoria=? AND stato IS NULL");
    try{
    stm.setString(1, category);
    ResultSet rs =stm.executeQuery();
    try{
    while(rs.next()) {
    Prodotti p = new Prodotti();
    p.setN_Lotto(rs.getInt("n_lotto"));
    p.setNome_Prodotto(rs.getString("nome_prodotto"));
    p.setDescrizione(rs.getString("descrizione"));
    p.setQuantita(rs.getInt("quantita"));
    p.setCategoria(rs.getString("categoria"));
    p.setSeller(rs.getString("venditore"));
    p.setPrezzo_Iniziale(rs.getFloat("prezzo_iniziale"));
    p.setIncremento_minOfferte(rs.getFloat("incremento_minOfferte"));
    p.setFotografia(rs.getString("fotografia"));
    p.setPrezzo_Spedizione(rs.getFloat("prezzo_spedizione"));
    p.setScadenza(rs.getTimestamp("scadenza"));
    p.setData_Immiss(rs.getTimestamp("data_immissione"));
    p.setUltima_offerta(rs.getFloat("ultima_offerta"));
    System.out.println("Db="+p.getDescrizione());
    prod.add(p);
}} finally {
rs.close();
}
} finally {
stm.close();
}
return prod;
}

public List<Prodotti> SearchName(String name) throws SQLException{
List<Prodotti> prod = new ArrayList<Prodotti>();
List<UltimaOfferta> uloff= new ArrayList<UltimaOfferta>();
System.out.println("ok db");
PreparedStatement stm2=con.prepareStatement("SELECT max(offerta),id_prodotto FROM storico_asta WHERE nome_prod=? AND risultato IS NULL GROUP BY id_prodotto");
try{
    stm2.setString(1, name);
    ResultSet rs=stm2.executeQuery();
    try{
        System.out.println("ok db2");        
        while(rs.next()){
        UltimaOfferta uof = new UltimaOfferta();
        uof.setIdProdotto(rs.getInt("id_prodotto"));
        uof.setUltimaOfferta(rs.getFloat("max(offerta)"));
        uloff.add(uof);
        System.out.println("ok db3");
          }}finally{
        rs.close();}
} finally {
stm2.close();
}


PreparedStatement stm3=con.prepareStatement("UPDATE prodotti SET ultima_offerta= ? WHERE n_lotto= ? ");
       try{
           for (int i=0; i<uloff.size();i++){
           
           System.out.println("ok db4");
           stm3.setFloat(1, uloff.get(i).getUltima_offerta());
           stm3.setInt(2, uloff.get(i).getIdProdotto());
           System.out.println("ok db45"+uloff.get(i).getUltima_offerta());
           
           
           stm3.executeUpdate();}
       }finally{
           stm3.close();
       } 

PreparedStatement stm = con.prepareStatement("SELECT n_lotto,nome_prodotto,quantita,descrizione,categoria,venditore,prezzo_iniziale,incremento_minOfferte,fotografia,prezzo_spedizione,scadenza,data_immissione,ultima_offerta FROM prodotti WHERE nome_prodotto=? AND stato IS NULL ");
    try{
    stm.setString(1, name);
    ResultSet rs =stm.executeQuery();
    try{
    while(rs.next()) {
    Prodotti p = new Prodotti();
    p.setN_Lotto(rs.getInt("n_lotto"));
    p.setNome_Prodotto(rs.getString("nome_prodotto"));
    p.setDescrizione(rs.getString("descrizione"));
    p.setQuantita(rs.getInt("quantita"));
    p.setCategoria(rs.getString("categoria"));
    p.setSeller(rs.getString("venditore"));
    p.setPrezzo_Iniziale(rs.getFloat("prezzo_iniziale"));
    p.setIncremento_minOfferte(rs.getFloat("incremento_minOfferte"));
    p.setFotografia(rs.getString("fotografia"));
    p.setPrezzo_Spedizione(rs.getFloat("prezzo_spedizione"));
    p.setScadenza(rs.getTimestamp("scadenza"));
    p.setData_Immiss(rs.getTimestamp("data_immissione"));
    p.setUltima_offerta(rs.getFloat("ultima_offerta"));
    System.out.println("Db="+p.getDescrizione());
    prod.add(p);
}} finally {
rs.close();
}
} finally {
stm.close();
}
return prod;
}

public Prodotti OffertaProdotto(int idP) throws SQLException{
    //List<Prodotti> prod = new ArrayList<Prodotti>();
    Prodotti p = null;
    PreparedStatement stm = con.prepareStatement("SELECT n_lotto,nome_prodotto,quantita,descrizione,categoria,venditore,prezzo_iniziale,incremento_minOfferte,fotografia,prezzo_spedizione,scadenza,data_immissione,ultima_offerta FROM prodotti WHERE n_lotto=? ");
    try{
    stm.setInt(1, idP);
    ResultSet rs =stm.executeQuery();
    try{
    while(rs.next()) {
    p = new Prodotti();
    p.setN_Lotto(rs.getInt("n_lotto"));
    p.setNome_Prodotto(rs.getString("nome_prodotto"));
    p.setDescrizione(rs.getString("descrizione"));
    p.setQuantita(rs.getInt("quantita"));
    p.setCategoria(rs.getString("categoria"));
    p.setSeller(rs.getString("venditore"));
    p.setPrezzo_Iniziale(rs.getFloat("prezzo_iniziale"));
    p.setIncremento_minOfferte(rs.getFloat("incremento_minOfferte"));
    p.setFotografia(rs.getString("fotografia"));
    p.setPrezzo_Spedizione(rs.getFloat("prezzo_spedizione"));
    p.setScadenza(rs.getTimestamp("scadenza"));
    p.setData_Immiss(rs.getTimestamp("data_immissione"));
    p.setUltima_offerta(rs.getFloat("ultima_offerta"));
    System.out.println("DbPROD_OFF="+p.getDescrizione());
    //prod.add(p);
}} finally {
rs.close();
}
} finally {
stm.close();
}
return p;
}

public String InserisciOfferta(int id_prodotto,String nome_prod,Timestamp time,float offerta,int id_utente,String username, String categoria, String descrizione) throws SQLException, FileNotFoundException {
        
    

    PreparedStatement stm = con.prepareStatement("INSERT INTO storico_asta(id_prodotto,nome_prod,data_ora_offerta,offerta,id_utente,username,categoria,descrizione) VALUES (?,?,?,?,?,?,?,?)");
 try{
    stm.setInt(1, id_prodotto);
    stm.setString(2, nome_prod);
    stm.setTimestamp(3, time);
    stm.setFloat(4, offerta);
    stm.setInt(5, id_utente);
    stm.setString(6, username);
    stm.setString(7, categoria);
    stm.setString(8, descrizione);
    
    stm.executeUpdate();

} finally {
stm.close();
}
return "OK";
}
public List<StoricoAsta> Ultime_offerte(int idUtente) throws SQLException{
    List<StoricoAsta> st_asta = new ArrayList<StoricoAsta>();
    PreparedStatement stm=con.prepareStatement("SELECT id_prodotto,nome_prod,data_ora_offerta,offerta, id_utente, username,categoria FROM storico_asta WHERE id_utente=? AND risultato IS NULL");
    try{
        stm.setInt(1, idUtente);
        ResultSet rs =stm.executeQuery();
    try{
    while(rs.next()) {
    StoricoAsta sa = new StoricoAsta();
    sa.setIdProdotto(rs.getInt("id_prodotto"));
    sa.setNomeProd(rs.getString("nome_prod"));
    sa.setDataOraOfferta(rs.getTimestamp("data_ora_offerta"));
    sa.setOfferta(rs.getFloat("offerta"));
    sa.setIdUtente(rs.getInt("id_utente"));
    sa.setUsername(rs.getString("username"));
    sa.setCategoria(rs.getString("categoria"));
    st_asta.add(sa);
    }} finally {
rs.close();
}
} finally {
stm.close();
}
return st_asta;
 }
public List<Prodotti> ControlloScadenze(Timestamp data_odierna) throws SQLException{
    List<Prodotti> prod= new ArrayList<Prodotti>();
    PreparedStatement stm=con.prepareStatement("SELECT n_lotto,nome_prodotto,quantita,descrizione,categoria,venditore,prezzo_iniziale,incremento_minOfferte,fotografia,prezzo_spedizione,scadenza,data_immissione FROM prodotti WHERE scadenza<= ?");
    try{
        stm.setTimestamp(1, data_odierna);
        ResultSet rs=stm.executeQuery();
        try{
            while(rs.next()){
                Prodotti p=new Prodotti();
                p.setN_Lotto(rs.getInt("n_lotto"));
                p.setNome_Prodotto(rs.getString("nome_prodotto"));
                p.setDescrizione(rs.getString("descrizione"));
                p.setQuantita(rs.getInt("quantita"));
                p.setCategoria(rs.getString("categoria"));
                p.setSeller(rs.getString("venditore"));
                p.setPrezzo_Iniziale(rs.getFloat("prezzo_iniziale"));
                p.setIncremento_minOfferte(rs.getFloat("incremento_minOfferte"));
                p.setFotografia(rs.getString("fotografia"));
                p.setPrezzo_Spedizione(rs.getFloat("prezzo_spedizione"));
                p.setScadenza(rs.getTimestamp("scadenza"));
                p.setData_Immiss(rs.getTimestamp("data_immissione"));
                prod.add(p);
                }} finally {
        rs.close();}
        } finally {
    stm.close();}
    return prod;
 }
public List<StoricoAsta> ControlloOffertaScadenze(int id_prodotto) throws SQLException{
    List<StoricoAsta> storA= new ArrayList<StoricoAsta>();
    PreparedStatement stm=con.prepareStatement("SELECT id_prodotto,nome_prod,data_ora_offerta,offerta,id_utente,username,categoria FROM storico_asta WHERE id_prodotto= ?");
    try{
        stm.setInt(1, id_prodotto);
        ResultSet rs=stm.executeQuery();
        try{
            while(rs.next()){
                StoricoAsta sa=new StoricoAsta();
                sa.setIdProdotto(rs.getInt("id_prodotto"));
                sa.setNomeProd(rs.getString("nome_prod"));
                sa.setDataOraOfferta(rs.getTimestamp("data_ora_offerta"));
                sa.setOfferta(rs.getFloat("offerta"));
                sa.setIdUtente(rs.getInt("id_utente"));
                sa.setUsername(rs.getString("username"));
                sa.setCategoria(rs.getString("categoria"));
             
                storA.add(sa);
                }} finally {
        rs.close();}
        } finally {
    stm.close();}
    return storA;
 }

public List<Vincitore> Vincitori(Timestamp time,int idUtenteCorr) throws SQLException{
    int idP=0;String nomeP = null;String vincitore=null;float prez_in=0;float ultima_off=0;
    float prezzo_spedizione=0;int idVinc=0;
    List<Vincitore> vinc = new ArrayList<Vincitore>();
    
    PreparedStatement stm1=con.prepareStatement("SELECT scadenza,n_lotto,nome_prodotto,prezzo_spedizione,prezzo_iniziale FROM prodotti WHERE stato IS NULL ");
       try{
            ResultSet rs2=stm1.executeQuery();
          try{
              while(rs2.next()){
                  
                  Timestamp scad=rs2.getTimestamp("scadenza");
                  int idProdotto=rs2.getInt("n_lotto");
                  String nomePRODOTTO=rs2.getString("nome_prodotto");
                  float prezzoSPEDIZIONE=rs2.getFloat("prezzo_spedizione");
                  float prezzoINIZIALE=rs2.getFloat("prezzo_iniziale");
                  
    if(scad.getTime()<= time.getTime()){
                  //java.util.Date data=new java.util.Date();
                  //Timestamp time_odierno= new Timestamp(data.getTime());
                  //if(scad.before(new Date().getTime())){
         //date.before(new Date());
                      System.out.println("scaduto"+scad+"idp="+idProdotto);              
              
    PreparedStatement stm=con.prepareStatement("SELECT max(offerta),id_utente,username,nome_prod,id_prodotto, p.prezzo_iniziale,p.prezzo_spedizione FROM storico_asta, prodotti p WHERE id_prodotto=? GROUP BY id_utente ORDER BY id_utente DESC LIMIT 1");
    try{
        System.out.println("db time"+time);
        stm.setInt(1, idProdotto);
        ResultSet rs=stm.executeQuery();
    try{
        while(rs.next()){
            idVinc= rs.getInt("id_utente");
            idP= rs.getInt("id_prodotto");
            nomeP= rs.getString("nome_prod");
            vincitore= rs.getString("username");
            prez_in=rs.getFloat("p.prezzo_iniziale");
            ultima_off=rs.getFloat("max(offerta)");
            prezzo_spedizione= rs.getFloat("p.prezzo_spedizione");
            
            Vincitore v=new Vincitore();
            v.setIdVinc(idVinc);
            v.setNomeP(nomeP);
            v.setIdProd(idP);
            vinc.add(v); System.out.println("DB VINC nomp"+idP+nomeP);
        }
            PreparedStatement stm2=con.prepareStatement("INSERT INTO vendita(id_prodotto,nome_prod,dataora,prezzo,id_utente,username,tassa_casa_asta,prezzo_spedizione) VALUES (?,?,?,?,?,?,?,?)");
              try{
                  
                  stm2.setInt(1, idProdotto);                 
                  
                  if(nomeP == null){
                      System.out.println("NESSUN ACQUIRENTE");
                      stm2.setString(2, nomePRODOTTO);
                      stm2.setTimestamp(3, time);
                      stm2.setFloat(4, prezzoINIZIALE);
                      stm2.setInt(5, 0);
                      stm2.setString(6, "NESSUN ACQUIRENTE");        
                      stm2.setDouble(7, 0.00);
                      stm2.setFloat(8, prezzoSPEDIZIONE);
                      
                  }else{
                      stm2.setString(2, nomeP);
                      stm2.setTimestamp(3, time);
                      stm2.setFloat(4, ultima_off);
                      stm2.setInt(5, idVinc);
                      stm2.setString(6, vincitore);
                      double tot= (((ultima_off+prezzo_spedizione)*1.25)/100)+ultima_off;
                      stm2.setDouble(7, tot);
                      stm2.setFloat(8, prezzo_spedizione);

                  }
                  
                    stm2.executeUpdate();
                  } finally {
                    stm2.close();
                }
               PreparedStatement stm3=con.prepareStatement("UPDATE storico_asta SET risultato='vinta' WHERE id_prodotto=? AND id_utente=? AND offerta=?");
             try{
                 System.out.println("P"+idP+"V"+idVinc);
                 stm3.setInt(1, idProdotto);
                 stm3.setInt(2, idVinc);
                 stm3.setFloat(3,ultima_off);
                 stm3.executeUpdate();
             }finally{
                 stm3.close();
             }
             
             PreparedStatement stm4=con.prepareStatement("UPDATE storico_asta SET risultato='persa' WHERE id_prodotto=? AND offerta!=?");
             try{
                 stm4.setInt(1, idProdotto);
                 stm4.setFloat(2, ultima_off);
                 stm4.executeUpdate();
             }finally{
                 stm4.close();
             }
             PreparedStatement stm5=con.prepareStatement("UPDATE prodotti SET stato='tolto' WHERE n_lotto=?");
            try{System.out.println("IDP="+idProdotto);
                stm5.setInt(1, idProdotto);
                stm5.executeUpdate();
            }finally{
                stm5.close();
            }
        
        
        } finally {
        rs.close();
        }
        } finally {
        stm.close();
        }
     }//IF
    }}finally{ //WHILE 2 TRY
         rs2.close();
          }}finally{
        stm1.close();
          }
        return vinc;
 }
    
    

public List<StoricoAsta> AsteCorrenti() throws SQLException{
    List<StoricoAsta> st_asta = new ArrayList<StoricoAsta>();
    PreparedStatement stm=con.prepareStatement("SELECT id_prodotto,nome_prod,data_ora_offerta,max(offerta), id_utente, username,categoria,descrizione FROM storico_asta WHERE risultato IS NULL GROUP BY id_prodotto ");
    try{
       
        ResultSet rs =stm.executeQuery();
    try{
    while(rs.next()) {
    StoricoAsta sa = new StoricoAsta();
    sa.setIdProdotto(rs.getInt("id_prodotto"));
    sa.setNomeProd(rs.getString("nome_prod"));
    sa.setDataOraOfferta(rs.getTimestamp("data_ora_offerta"));
    sa.setOfferta(rs.getFloat("max(offerta)"));
    sa.setIdUtente(rs.getInt("id_utente"));
    sa.setUsername(rs.getString("username"));
    sa.setCategoria(rs.getString("categoria"));
    sa.setDescrizione(rs.getString("descrizione"));
    st_asta.add(sa);
    }} finally {
rs.close();
}
} finally {
stm.close();
}
return st_asta;
 }
public List<StoricoAsta> AsteAnnullate() throws SQLException{
    List<StoricoAsta> st_asta = new ArrayList<StoricoAsta>();
    PreparedStatement stm=con.prepareStatement("SELECT id_prodotto,nome_prod,data_ora_offerta,max(offerta), id_utente, username,categoria,descrizione FROM storico_asta WHERE risultato='annullata' GROUP BY id_prodotto ");
    try{
       
        ResultSet rs =stm.executeQuery();
    try{
    while(rs.next()) {
    StoricoAsta sa = new StoricoAsta();
    sa.setIdProdotto(rs.getInt("id_prodotto"));
    sa.setNomeProd(rs.getString("nome_prod"));
    sa.setDataOraOfferta(rs.getTimestamp("data_ora_offerta"));
    sa.setOfferta(rs.getFloat("max(offerta)"));
    sa.setIdUtente(rs.getInt("id_utente"));
    sa.setUsername(rs.getString("username"));
    sa.setCategoria(rs.getString("categoria"));
    sa.setDescrizione(rs.getString("descrizione"));
    st_asta.add(sa);
    }} finally {
rs.close();
}
} finally {
stm.close();
}
return st_asta;
 }
    
public StoricoAsta AsteDeleted(int idP) throws SQLException{
    //List<StoricoAsta> st_asta = new ArrayList<StoricoAsta>();
    StoricoAsta sa = null;
    PreparedStatement stm=con.prepareStatement("SELECT id_prodotto,nome_prod,data_ora_offerta,max(offerta), id_utente, username,categoria,descrizione FROM storico_asta WHERE id_prodotto= ? GROUP BY id_prodotto ");
    try{
        stm.setInt(1, idP);
        ResultSet rs =stm.executeQuery();
    try{
    while(rs.next()) {
    sa = new StoricoAsta();
    sa.setIdProdotto(rs.getInt("id_prodotto"));
    sa.setNomeProd(rs.getString("nome_prod"));
    sa.setDataOraOfferta(rs.getTimestamp("data_ora_offerta"));
    sa.setOfferta(rs.getFloat("max(offerta)"));
    sa.setIdUtente(rs.getInt("id_utente"));
    sa.setUsername(rs.getString("username"));
    sa.setCategoria(rs.getString("categoria"));
    sa.setDescrizione(rs.getString("descrizione"));
    //st_asta.add(sa);
    }} finally {
rs.close();
}
} finally {
stm.close();
}
return sa;
 }

public List<Vendita> Vendita() throws SQLException{
    List<Vendita> vend = new ArrayList<Vendita>();
    PreparedStatement stm=con.prepareStatement("SELECT id_utente,id_prodotto,nome_prod,dataora,prezzo,prezzo_spedizione,tassa_casa_asta,username FROM vendita ");
    try{
       
        ResultSet rs =stm.executeQuery();
    try{
    while(rs.next()) {
    Vendita v = new Vendita();
    v.setIdUtente(rs.getInt("id_utente"));
    v.setIdProdotto(rs.getInt("id_prodotto"));
    v.setNomeProd(rs.getString("nome_prod"));
    v.setDataOra(rs.getTimestamp("dataora"));
    v.setPrezzo(rs.getFloat("prezzo"));
    v.setPrezzoSpedizione(rs.getFloat("prezzo_spedizione"));
    v.setTassaCasaDAsta(rs.getFloat("tassa_casa_asta"));
    v.setUsername(rs.getString("username"));
  
    vend.add(v);
    
    }} finally {
rs.close();
}
} finally {
stm.close();
}
return vend;
 }
public List<StoricoAsta> AstePerse(int idUtente) throws SQLException{
    List<StoricoAsta> st_asta = new ArrayList<StoricoAsta>();
    StoricoAsta sa = null;
    PreparedStatement stm=con.prepareStatement("SELECT id_prodotto,nome_prod,data_ora_offerta,offerta, id_utente, username,categoria,descrizione FROM storico_asta WHERE risultato= 'persa' AND id_utente= ? ");
    try{
        stm.setInt(1, idUtente);
        ResultSet rs =stm.executeQuery();
    try{
    while(rs.next()) {
    sa = new StoricoAsta();
    sa.setIdProdotto(rs.getInt("id_prodotto"));
    sa.setNomeProd(rs.getString("nome_prod"));
    sa.setDataOraOfferta(rs.getTimestamp("data_ora_offerta"));
    sa.setOfferta(rs.getFloat("offerta"));
    sa.setIdUtente(rs.getInt("id_utente"));
    sa.setUsername(rs.getString("username"));
    sa.setCategoria(rs.getString("categoria"));
    sa.setDescrizione(rs.getString("descrizione"));
    st_asta.add(sa);
    }} finally {
rs.close();
}
} finally {
stm.close();
}
return st_asta;
 }
public List<Vendita> Ultime_acquisti(int idUtente) throws SQLException{
    List<Vendita> vend = new ArrayList<Vendita>();
    PreparedStatement stm=con.prepareStatement("SELECT id_prodotto,nome_prod,dataora,tassa_casa_asta, id_utente, username,prezzo,prezzo_spedizione FROM vendita WHERE id_utente=?");
    try{
        stm.setInt(1, idUtente);
        ResultSet rs =stm.executeQuery();
    try{
    while(rs.next()) {
    Vendita v = new Vendita();
    v.setIdProdotto(rs.getInt("id_prodotto"));
    v.setIdUtente(rs.getInt("id_utente"));
    v.setNomeProd(rs.getString("nome_prod"));
    v.setDataOra(rs.getTimestamp("dataora"));
    v.setTassaCasaDAsta(rs.getFloat("tassa_casa_asta"));
    v.setUsername(rs.getString("username"));
    v.setPrezzo(rs.getFloat("prezzo"));
    v.setPrezzoSpedizione(rs.getFloat("prezzo_spedizione"));
    vend.add(v);
    }} finally {
rs.close();
}
} finally {
stm.close();
}
return vend;
 }
        
public List<StoricoAsta> DatiInvioEmail(int idProd) throws SQLException{
    List<StoricoAsta> st_asta = new ArrayList<StoricoAsta>();
    StoricoAsta sa = null;
    PreparedStatement stm=con.prepareStatement("SELECT id_utente,u.email,u.nome,u.cognome,u.username,id_prodotto,nome_prod,data_ora_offerta,offerta, id_utente,descrizione,categoria FROM storico_asta, utilizzatore u WHERE id_prodotto=? AND id_utente=u.id");
    try{
        stm.setInt(1, idProd);
        ResultSet rs =stm.executeQuery();
    try{
    while(rs.next()) {
    sa = new StoricoAsta();
    sa.setIdUtente(rs.getInt("id_utente"));
    sa.setIdProdotto(rs.getInt("id_prodotto"));
    sa.setNomeProd(rs.getString("nome_prod"));
    sa.setDataOraOfferta(rs.getTimestamp("data_ora_offerta"));
    sa.setOfferta(rs.getFloat("offerta"));
    sa.setIdUtente(rs.getInt("id_utente"));
    sa.setUsername(rs.getString("u.username"));
    sa.setCategoria(rs.getString("categoria"));
    sa.setDescrizione(rs.getString("descrizione"));
    sa.setEmail(rs.getString("u.email"));
    sa.setNomeUtente(rs.getString("u.nome"));
    sa.setCognomeUtente(rs.getString("u.cognome"));
    st_asta.add(sa);
    }} finally {
rs.close();
}
} finally {
stm.close();
}
return st_asta;
 }

public String AnnullaAsta(int idProdotto, int idUtente) throws SQLException{
    PreparedStatement stm=con.prepareStatement("UPDATE storico_asta SET risultato='annullata' WHERE id_prodotto=? AND id_utente=? AND risultato IS NULL");
    try{
        stm.setInt(1, idProdotto);
        stm.setInt(2, idUtente);
        stm.executeUpdate();
    }finally{
        stm.close();
    }
    PreparedStatement stm2=con.prepareStatement("UPDATE prodotti SET stato='annullato' WHERE n_lotto=? AND stato IS NULL");
    try{
        stm2.setInt(1, idProdotto);
        stm2.executeUpdate();
    }finally{
        stm.close();
    }
    return "ok";
}
public String RipristinaAsta(int idProdotto) throws SQLException{
    PreparedStatement stm=con.prepareStatement("UPDATE storico_asta SET risultato=null WHERE id_prodotto=? AND risultato='annullata'");
    try{
        stm.setInt(1, idProdotto);
       
        stm.executeUpdate();
    }finally{
        stm.close();
    }
    PreparedStatement stm2=con.prepareStatement("UPDATE prodotti SET stato=null WHERE n_lotto=? AND stato='annullato'");
    try{
        stm2.setInt(1, idProdotto);
        stm2.executeUpdate();
    }finally{
        stm.close();
    }
    return "ok";
}
public List<StoricoAsta> RipristinoInvioEmail(int idProd) throws SQLException{
    List<StoricoAsta> st_asta = new ArrayList<StoricoAsta>();
    StoricoAsta sa = null;
    PreparedStatement stm=con.prepareStatement("SELECT id_utente,u.email,u.nome,u.cognome,u.username,id_prodotto,nome_prod,data_ora_offerta,offerta, id_utente,descrizione,categoria FROM storico_asta, utilizzatore u WHERE id_prodotto=? AND risultato='annullata' AND id_utente=u.id");
    try{
        stm.setInt(1, idProd);
        ResultSet rs =stm.executeQuery();
    try{
    while(rs.next()) {
    sa = new StoricoAsta();
    sa.setIdUtente(rs.getInt("id_utente"));
    sa.setIdProdotto(rs.getInt("id_prodotto"));
    sa.setNomeProd(rs.getString("nome_prod"));
    sa.setDataOraOfferta(rs.getTimestamp("data_ora_offerta"));
    sa.setOfferta(rs.getFloat("offerta"));
    sa.setIdUtente(rs.getInt("id_utente"));
    sa.setUsername(rs.getString("u.username"));
    sa.setCategoria(rs.getString("categoria"));
    sa.setDescrizione(rs.getString("descrizione"));
    sa.setEmail(rs.getString("u.email"));
    sa.setNomeUtente(rs.getString("u.nome"));
    sa.setCognomeUtente(rs.getString("u.cognome"));
    st_asta.add(sa);
    }} finally {
rs.close();
}
} finally {
stm.close();
}
return st_asta;
 }

public List<StoricoAsta> ControlloOfferte(int id_prod,float myOff,int utente) throws SQLException{
    List<StoricoAsta> st_asta = new ArrayList<StoricoAsta>();
    PreparedStatement stm=con.prepareStatement("SELECT id_asta,nome_prod,data_ora_offerta,max(offerta), id_utente, username,incremento_minOfferte FROM storico_asta, prodotti p WHERE id_prodotto=? AND offerta>? AND id_utente=? AND risultato IS NULL GROUP BY id_prodotto");
    try{
        stm.setInt(1, id_prod);
        stm.setFloat(2, myOff);
        stm.setInt(3, utente);
        ResultSet rs =stm.executeQuery();
    try{
    while(rs.next()) {
    StoricoAsta sa = new StoricoAsta();
    sa.setIdAsta(rs.getInt("id_asta"));
    sa.setNomeProd(rs.getString("nome_prod"));
    sa.setDataOraOfferta(rs.getTimestamp("data_ora_offerta"));
    sa.setOfferta(rs.getFloat("max(offerta)"));
    sa.setIdUtente(rs.getInt("id_utente"));
    sa.setUsername(rs.getString("username"));
    sa.setIncrMin(rs.getFloat("incremento_minOfferte"));
    st_asta.add(sa);
    }} finally {
rs.close();
}
} finally {
stm.close();
}
return st_asta;
 }
public List<StoricoAsta> ControlloIdProd(int utente) throws SQLException{
    List<StoricoAsta> st_asta = new ArrayList<StoricoAsta>();
    List<Prodotti> prod = new ArrayList<Prodotti>();
    List<UltimaOfferta> uloff= new ArrayList<UltimaOfferta>();

    PreparedStatement stm2=con.prepareStatement("SELECT max(offerta),id_prodotto FROM storico_asta WHERE  risultato IS NULL GROUP BY id_prodotto");
try{
 
    ResultSet rs=stm2.executeQuery();
    try{
        System.out.println("ok db2");        
        while(rs.next()){
        UltimaOfferta uof = new UltimaOfferta();
        uof.setIdProdotto(rs.getInt("id_prodotto"));
        uof.setUltimaOfferta(rs.getFloat("max(offerta)"));
        uloff.add(uof);
        System.out.println("ok db3");
          }}finally{
        rs.close();}
} finally {
stm2.close();
}


PreparedStatement stm3=con.prepareStatement("UPDATE prodotti SET ultima_offerta= ? WHERE n_lotto= ? ");
       try{
           for (int i=0; i<uloff.size();i++){
           
           System.out.println("ok db4");
           stm3.setFloat(1, uloff.get(i).getUltima_offerta());
           stm3.setInt(2, uloff.get(i).getIdProdotto());
           System.out.println("ok db45"+uloff.get(i).getUltima_offerta());
           
           
           stm3.executeUpdate();}
       }finally{
           stm3.close();
       } 

    
    PreparedStatement stm=con.prepareStatement("SELECT id_asta,id_prodotto, max(offerta),max(ultima_offerta),nome_prod,incremento_minOfferte, data_ora_offerta FROM storico_asta,prodotti WHERE id_utente=? AND id_prodotto=n_lotto AND offerta<ultima_offerta AND risultato IS NULL GROUP BY id_prodotto ORDER BY ultima_offerta DESC");
    try{
        stm.setInt(1, utente);
        ResultSet rs =stm.executeQuery();
    try{
    while(rs.next()) {
    StoricoAsta sa = new StoricoAsta();
    sa.setIdAsta(rs.getInt("id_asta"));
    sa.setIdProdotto(rs.getInt("id_prodotto"));
    sa.setOfferta(rs.getFloat("max(offerta)"));
    sa.setUltimaOff(rs.getFloat("max(ultima_offerta)"));
    sa.setDataOraOfferta(rs.getTimestamp("data_ora_offerta"));
    sa.setNomeProd(rs.getString("nome_prod"));
    sa.setIncrMin(rs.getFloat("incremento_minOfferte"));    
    st_asta.add(sa);
    }} finally {
rs.close();
}
} finally {
stm.close();
}
return st_asta;
 }

public String ScriviMex(int vincitore, String messaggio) throws SQLException{
    PreparedStatement stm=con.prepareStatement("INSERT INTO messaggi_vincita(id_utente, message) VALUES(?,?)");
    try{
        stm.setInt(1, vincitore);
        stm.setString(2, messaggio);
        stm.executeUpdate();
    }finally{
    stm.close();
    }
    return "ok";
}
    
public List<MessagiVincita> PrendiMes(int id_utente) throws SQLException{
    List<MessagiVincita> mes= new ArrayList<MessagiVincita>();
    PreparedStatement stm=con.prepareStatement("SELECT id,id_utente,message FROM messaggi_vincita WHERE id_utente=? AND stato IS NULL");
    try{
        stm.setInt(1, id_utente);
        ResultSet rs=stm.executeQuery();
        try{
            while(rs.next()) {
            MessagiVincita m = new MessagiVincita();
            m.setIdAsta(rs.getInt("id"));
            m.setIdVinc(rs.getInt("id_utente"));
            m.setMessage(rs.getString("message"));
            mes.add(m);
            
            PreparedStatement stm2=con.prepareStatement("UPDATE messaggi_vincita SET stato='visto' WHERE id_utente= ?");
            try{
                stm2.setInt(1, id_utente);
                stm2.executeUpdate();
            }finally{
                stm2.close();
            }
            
            }} finally {
            rs.close();
            }
            } finally {
            stm.close();
            }
            return mes;
        }
public List<Vendita> InvioEmailVendita(int idP) throws SQLException{
    List<Vendita> vend= new ArrayList<Vendita>();
    PreparedStatement stm=con.prepareStatement("SELECT id_prodotto,nome_prod,dataora,prezzo_spedizione,tassa_casa_asta,username FROM vendita WHERE id_prodotto=?");
    try{
        stm.setInt(1, idP);
        ResultSet rs= stm.executeQuery();
        try{
            while(rs.next()) {
                Vendita v= new Vendita();
                v.setIdProdotto(rs.getInt("id_prodotto"));
                v.setNomeProd(rs.getString("nome_prod"));
                v.setDataOra(rs.getTimestamp("dataora"));
                v.setPrezzoSpedizione(rs.getFloat("prezzo_spedizione"));
                v.setTassaCasaDAsta(rs.getFloat("tassa_casa_asta"));
                v.setUsername(rs.getString("username"));
                vend.add(v);
                }} finally {
            rs.close();
            }
            } finally {
            stm.close();
            }
            return vend;
        
            }
        
public List<StoricoAsta> StoricoRialzo(int idProdotto) throws SQLException{
    List<StoricoAsta> st_asta = new ArrayList<StoricoAsta>();
    PreparedStatement stm=con.prepareStatement("SELECT id_prodotto,nome_prod,data_ora_offerta,offerta, id_utente, username,categoria,descrizione FROM storico_asta WHERE id_prodotto=? AND risultato IS NOT NULL ");
    try{
        stm.setInt(1, idProdotto);
        ResultSet rs =stm.executeQuery();
    try{
    while(rs.next()) {
    StoricoAsta sa = new StoricoAsta();
    sa.setIdProdotto(rs.getInt("id_prodotto"));
    sa.setNomeProd(rs.getString("nome_prod"));
    sa.setDataOraOfferta(rs.getTimestamp("data_ora_offerta"));
    sa.setOfferta(rs.getFloat("offerta"));
    sa.setIdUtente(rs.getInt("id_utente"));
    sa.setUsername(rs.getString("username"));
    sa.setCategoria(rs.getString("categoria"));
    sa.setDescrizione(rs.getString("descrizione"));
    st_asta.add(sa);
    }} finally {
rs.close();
}
} finally {
stm.close();
}
return st_asta;
 }
    }


    